public class SparseMatrix {
    public TripleNode data[];//三元组表
    public int rows;        //行数
    public int cols;        //列数
    public int nums;    //非零元素个数
    int sa[][];    
    
    //构造函数，为顺序表分配maxSize个空间
    public SparseMatrix(int maxSize){
        data  = new TripleNode[maxSize];
        for(int i =0;i<data.length;i++){
            data[i] = new TripleNode();
        }
        rows = 0;
        cols = 0;
        nums = 0;

    }
    
    //打印出矩阵
    public void printMatrix1(){
        System.out.println("原矩阵（稀疏矩阵）为：");
        for(int i =0;i<sa.length;i++){
            for(int j=0;j< sa[0].length; j++) {
                System.out.print(sa[i][j] + " ");
            }
            System.out.println();
        }
    }

    // 打印输出稀疏矩阵
    public void printMatrix(){
        int i;
        System.out.println("稀疏矩阵的三元组存储结构:");
        System.out.println("行数："+ this.rows +",列数："+ this.cols + " ,非零元素个数："+ nums);
        System.out.println("行下标 列下标 元素值");
        for(i =0;i<nums;i++){
            System.out.println(data[i].row + "\t"+ data[i].column + "\t"+data[i].value);
            
        }
    }
    //初始化三元矩阵顺序表
    //从一个矩阵创建一个三元表，mat为稀疏矩阵
    public  SparseMatrix(int mat[][]) {
        sa = mat;
        int k = 0;
        int count = 0;
        rows = mat.length;//行数
        cols = mat[0].length;//列数
        //遍历数组内非零元
        for(int i =0;i<mat.length;i++){ //统计非零元的个数
            for(int j=0;j<mat[i].length;j++){
                if(mat[i][j]!=0){
                    count++;
                }
            }
        }
        nums = count;//非零元的个数赋值给nums
        data = new TripleNode[nums];//申请三元组结点空间
        for(int i =0;i<mat.length;i++){
            for(int j=0;j<mat[i].length;j++){
                if(mat[i][j]!=0){
                    data[k] = new TripleNode(i,j,mat[i][j]);//建立三元组
                    k++;
                }
            }
        }
    }

	public SparseMatrix transpose(){
        SparseMatrix tm = new SparseMatrix(nums);
        tm.cols = rows;
        tm.rows = cols;
        tm.nums = nums;
        int q = 0;
        for (int col = 0; col<cols;col++){
            for(int p =0;p<nums;p++){
                if(data[p].column==col){
                    tm.data[q].row =data[p].column;
                    tm.data[q].column = data[p].row;
                    tm.data[q].value = data[p].value;
                    q++;
                }
            }
        }
        return tm;    
    }

    // public  SparseMatrix addSMatrix(SparseMatrix a,SparseMatrix b){
    //     //计算两个三元组表示的稀疏矩阵之和
    //     if(a.rows!=b.rows ||a.cols!=b.cols){
    //         System.out.println("这两个矩阵不能相加");
    //         return null;
    //     }
    //     SparseMatrix c = new SparseMatrix(a.nums+b.nums);
    //     int i=0,j=0,k=0 ,len = 0;
    //     while(i<a.nums&&j<b.nums){
    //         if(a.data[i].row<b.data[j].row){    // A行<B行
    //             c.data[k].column = a.data[i].column;
    //             c.data[k].row = a.data[i].row;
    //             c.data[k].value = a.data[i].value;
    //             c.nums = ++k;
    //             i++;
    //         }else if(a.data[i].row == b.data[j].row){   // A行=B行
    //             if(a.data[i].column==b.data[j].column){  //A列 = B列
    //                 if(a.data[i].value + b.data[j].value !=0){
    //                     c.data[k].column = a.data[i].column;
    //                     c.data[k].row = a.data[i].row;
    //                     c.data[k].value = a.data[i].value+b.data[j].value;
    //                     c.nums = ++k;
    //                 }
    //                 i++;
    //                 j++;
    //             }else if(a.data[i].column <b.data[j].column){ //A列<B列
    //                 c.data[k].column = a.data[i].column;
    //                 c.data[k].row = a.data[i].row;
    //                 c.data[k].value = a.data[i].value;
    //                 i++;
    //             }else if(a.data[i].column >b.data[j].column){  //A列>>B列
    //                 c.data[k].column = b.data[j].column;
    //                 c.data[k].row = b.data[j].row;
    //                 c.data[k].value = b.data[j].value;
    //                 c.nums = ++k;
    //                 j++;
    //             }
    //         }else if(a.data[i].row < b.data[j].row){
    //             c.data[k].column = a.data[i].column;
    //             c.data[k].row = a.data[i].row;
    //             c.data[k].value = a.data[i].value;
    //             c.nums = ++k;
    //             i++;
    //         }
    //     }
    //     while(i<a.nums){
    //         c.data[k].column = a.data[i].column;
    //         c.data[k].row = a.data[i].row;
    //         c.data[k].value = a.data[i].value;
    //         c.nums = ++k;
    //         i++;
    //     }
    //     while(j<b.nums){
    //         c.data[k].column = b.data[j].column;
    //         c.data[k].row = b.data[j].row;
    //         c.data[k].value = b.data[j].value;
    //         c.nums = ++k;
    //         j++;
    //     }    
	// 	return c; 
    // }
}
